package com.company.task;

import java.awt.desktop.SystemSleepEvent;
import java.awt.font.FontRenderContext;
import java.sql.PseudoColumnUsage;
import java.util.IllegalFormatCodePointException;
import java.util.Random;
import java.util.Scanner;

public class ArrayDemo {

    private static final   char CHA = '1';
    private static final  char CHA2 = '2';
    private static boolean boo = true;
    private static boolean booln = true;

    /**
     * 绘制五子棋棋盘遍历每行每列，左上角到右下角，右上角到左下角 的和
     * 定义长度为16的二维数组
     * 遍历二维数组通过第三变量来记录每次相加的和
     * 左上角到右下角 行列都递增
     * 右上角到左下角列递增行取数组的最大值递减
     * 输出打印
     */

    public void arrs(){
        int[][] arr = new int[16][16];
        Random random = new Random();
        for (int i = 0;i < 16;i++){
            for (int j = 0;j<16;j++){
                arr[i][j] = random.nextInt(16)+1;;
            }
        }
        //用来记录四个方向某一方向 想加个元素的和
        int temporary = 0;
        int temporary2 = 0;
        int temporary3 = 0;
        int temporary4 = 0;
        int a = arr.length;
        // 每行相加之和 操作横向变化
        // 每列相加之和 操作竖向变化
        // 左上到右下相加之和 横竖每次都加1
        // 右上到坐下相加之和 行的最大值每次减1列的最小值每次加1
        for (int i = 0;i < 16;i++){
            System.out.println();
            for (int j = 0;j < 16;j++){
                temporary += arr[i][j];
                temporary2 +=arr[j][i];
                System.out.print(arr[i][j]+"    ");
            }
             System.out.print("每行总和"+temporary);
             temporary = 0;
        System.out.println("每列总和 "+temporary2);
             temporary2 = 0;
            temporary3 += arr[i][i];
            temporary4 += arr[i][a];
            a--;
        }
        System.out.print("斜线左上角到右下角"+temporary3+"   ");
        System.out.println("斜线右上角到左下角"+temporary4);
    }

    /**
     * 调用棋盘生成方法，绘制棋盘。
     * 键盘输入 判断输入的类型和范围 范围超出从新输入 类型错误从新输入
     * 调用棋子位置的方法
     * 通过调用的方法对变量的改变来判断  胜 负 和
     */
    public void GoBang() {
        char[][] arr = new char[16][16];
//        GoBangarr(arr);
        System.out.println();
        int a = 0,b = 0;//用来接收键盘输入
        boolean bn,ban,bln =true; //用来判断条件是否成立 来是否终止循环
        Scanner sr = new Scanner(System.in);
        while(bln){
             bn = true;
             ban = true;
            if (boo){
                System.out.println("白棋输入");
            }else {
                System.out.println("黑棋输入");
            }
            while(bn){
                if (ban == true){
                    System.out.println("输入行：");
                    if (sr.hasNextInt()){
                        a = sr.nextInt();
                        if (a<15 && a>0){
                            bn = false;
                        }else {
                            System.out.println("超出范围");
                            sr = new Scanner(System.in);
                        }
                    }else {
                        System.out.println("类型无效,或超出范围");
                        sr = new Scanner(System.in);
                    }
                }
                if (bn != true){
                    System.out.println("输入列：");
                    if (sr.hasNextInt()){
                        b = sr.nextInt();
                        if (b<15&&b>0){
                            bn = bn;
                            System.out.println(bn);
                        }else {
                            System.out.println("超出范围，从新输入");
                            sr = new Scanner(System.in);
                            ban = false;
                        }
                    } else {
                        System.out.println("类型无效,或超出范围");
                        sr = new Scanner(System.in);
                            ban = false;
                    }
                }
                if (ban&&bn==false){
                    if (boo == false){
                        GoBangarr(arr, a,b,CHA);
                    }else {
                        GoBangarr(arr ,a,b,CHA2);
                    }
                }
                System.out.println();
            }
            //当数组所有位置都被赋值的时候没有出现5个连续相同的元素时 游戏结束
            if (ands(arr) == 0){
                System.out.println("和其");
                bln = false;
            }
            // 当出现5个连续相同的元素时 表示某一方胜出， 结束
            if (booln == false){
                if (boo == true)
               System.out.println("黑棋胜利");
                else System.out.println("白棋胜利");
                bln = false;
            }
        }

    }

    /**
     * 棋盘    https://gitee.com/zhao-yubo1/phase-i-module-2
     */
    public static void GoBangarr(char[][] arr){

        for (int i = 0;i<arr.length;i++) {
            if (i == 0) {
                System.out.print(" ");
            } else if (i > 10) {
                System.out.println();
                System.out.print((char) ((i - 1) + 87));
            } else {
                System.out.println();
                System.out.print(i - 1);
            }
            for (int j = 0; j < arr[i].length; j++) {
                if (arr[i][j] == 0) {
                    arr[i][j] = '+';
                }
                if (i == 0) {
                    if (j > 9) {
                        System.out.print("  " + (char) (j + 87));
                    } else {
                        System.out.print("  " + j);
                    }
                } else
                    System.out.print("  " + arr[i][j]);
            }
        }
    }

    /**
     *
     * @param arr
     * @param a
     * @param b
     * @param color
     *
     * 通过参数来判断该位置是否已经有棋子 如果有棋子返回调用方法的方法从新输入如果没有棋子 就保存到二维数组中
     * 调用刷新棋盘的方法刷新棋盘。
     * 判断传过来的参数对应二维数组中的位置的上下左右等八个方位，判断相邻相同的，如果有通过变量计数，当变量等于5时 游戏结束，
     */
    public  void GoBangarr(char[][] arr ,int a , int b,char color) {
        //记录 横 竖 撇 捺 八个方向 连续相同的元素个数；
        int record = 0, record2 = 0, record3 = 0, record4 = 0;
        boolean bn = true;
        // 判断数组当前位置是否存在数据，当存在时打印提示信息，从新调用输入数据方法
        while (bn == true) {
            if (arr[a][b] == 0 || arr[a][b] == '+') {
                arr[a][b] = color;
                boo = !boo;
                bn = false;
            } else {
                System.out.println("专注点已有棋子");
                GoBang();
            }
        }
        GoBangarr(arr);

        //当输入完数组的位置后，以该位置为中心横 竖 撇 捺 判断相同数据单个方向是否有5个连续相同的。
        int c1 = a,c = b;//记录传过来的下标，当向某一个方向比较时不相等则通过该下标向相反方向查找。
        for (int i = 0; i < 5; i++) {
            if ((b + i) < 15 && arr[a][b + i] == color) {
                record++;
                if (record == 5) {
                    booln = false;
                    break;
                }
            } else if ((b - i) > 0 && arr[a][b - i] == color) {
                record++;
                if (record == 5) {
                    booln = false;
                    break;
                }
            } else if ((b + i) > 15 && arr[a][b - c] == color) {
                record++;
                if (record == 5) {
                    booln = false;
                    break;
                }
            }

            if ((a + i) < 15 && arr[a + i][b] == color) {
                record2++;
                if (record2 == 5) {
                    booln = false;
                    break;
                }
            } else if ((a - i) > 0 && arr[a - i][b] == color) {
                record2++;
                if (record2 == 5) {
                    booln = false;
                    break;
                }
            } else if ((a + i) > 15 && arr[a - c1][b] == color) {
                record2++;
                if (record2 == 5) {
                    booln = false;
                    break;
                }
            }

            if (((a + i) < 15 && (b + i) < 15) && arr[a + i][b + i] == color) {
                record3++;
                if (record3 == 5) {
                    booln = false;
                    break;
                }
            } else if (((a + i) > 15 && (b + i) > 15) && arr[(a++) - c1][(b++) - c] == color) {
                record3++;
                if (record3 == 5) {
                    booln = false;
                    break;
                }
            } else if (((a - i) > 0 && (b - i) > 0) && arr[a - i][b - i] == color) {
                record3++;
                if (record3 == 5) {
                    booln = false;
                    break;
                }
            }

            if (((a - i) > 0 && (b + i) < 15) && arr[a - i][b + i] == color) {
                record4++;
                if (record4 == 5) {
                    booln = false;
                    break;
                }
            } else if (((a + i) < 15 && (b - i) > 0) && arr[a + i][b - i] == color) {
                record4++;
                if (record4 == 5) {
                    booln = false;
                    break;
                }
            }
        }
    }
    /**
     *
     * @param arr
     * @return
     * 当二维数组每个元素空间都被赋值，判断和棋
     */
    private static int  ands(char[][] arr){
        int and = 1;
        for (int i=1;i<arr.length;i++){
            for (int j = 1;j<arr.length;j++){
                if (arr[i][j] == CHA2||arr[i][j] == CHA){
                    and = 0;
                }else {
                    and = 1;
                }
            }
        }
        return and;
    }
}
